package com.atg.atgchat.init.user.service.imp;

import com.atg.atgchat.init.annotation.RedissonLock;
import com.atg.atgchat.init.common.utils.AssertUtil;
import com.atg.atgchat.init.user.dao.UserBackpackDao;
import com.atg.atgchat.init.user.mapper.UserBackpackMapper;
import com.atg.atgchat.init.user.model.entity.ItemConfig;
import com.atg.atgchat.init.user.model.entity.UserBackpack;
import com.atg.atgchat.init.user.model.enums.IdempotentTypeEnum;
import com.atg.atgchat.init.user.model.enums.ItemTypeEnum;
import com.atg.atgchat.init.user.model.enums.YesOrNoEnum;
import com.atg.atgchat.init.user.service.LockService;
import com.atg.atgchat.init.user.service.UserBackpackService;
import com.atg.atgchat.init.user.service.cache.ItemCache;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

/*
author: atg
time: 2025/1/16 15:43
*/
@Service
public class UserBackpackServiceImpl implements UserBackpackService {
    @Resource
    private RedissonClient redissonClient;
    @Resource
    private ItemCache itemCache;
    @Resource
    private UserBackpackDao userBackpackDao;
//    @Override
//    public void acquireItem(Long uid, Long itemId, IdempotentTypeEnum idempotentTypeEnum, String businessId) {
//        // 组装--幂等号
//        String idempotentKey = getIdempotentKey(uid, idempotentTypeEnum, businessId);
//        RLock lock = redissonClient.getLock("acquireItem" + idempotentKey);
//        boolean tryLock = lock.tryLock();
//        AssertUtil.isTrue(tryLock, "请勿重复操作哦");
//        try {
//            UserBackpack byIdempotent = userBackpackDao.getByIdempotent(idempotentKey);
//            if(Objects.nonNull(byIdempotent)){
//                return;
//            }
//            UserBackpack build = UserBackpack.builder()
//                    .uid(uid)
//                    .itemId(itemId)
//                    .status(YesOrNoEnum.NO.getStatus())
//                    .idempotent(idempotentKey)
//                    .build();
//            userBackpackDao.save(build);
//        }finally {
//            lock.unlock();
//        }


    @Resource
    private LockService lockService;

//    @Override
//    public void acquireItem(Long uid, Long itemId, IdempotentTypeEnum idempotentTypeEnum, String businessId) {
//        // 组装--幂等号
//        String idempotentKey = getIdempotentKey(uid, idempotentTypeEnum, businessId);
//        lockService.executeLock("acquireItem" + idempotentKey,  () -> {
//            UserBackpack byIdempotent = userBackpackDao.getByIdempotent(idempotentKey);
//            if (Objects.nonNull(byIdempotent)) {
//                return ;
//            }
//            UserBackpack build = UserBackpack.builder()
//                    .uid(uid)
//                    .itemId(itemId)
//                    .status(YesOrNoEnum.NO.getStatus())
//                    .idempotent(idempotentKey)
//                    .build();
//            userBackpackDao.save(build);
//            return ;
//        });
//    }

    @Override
    @RedissonLock(key = "#idempotentKey",waitTime = 5000)
    public void acquireItem(Long uid, Long itemId, IdempotentTypeEnum idempotentTypeEnum, String businessId) {
        // 组装--幂等号
        String idempotentKey = getIdempotentKey(uid, idempotentTypeEnum, businessId);
        UserBackpack byIdempotent = userBackpackDao.getByIdempotent(idempotentKey);
        if (Objects.nonNull(byIdempotent)) {
            return;
        }
        // 业务检查
        ItemConfig itemCacheById = itemCache.getById(itemId);
        if (ItemTypeEnum.BADGE.getType().equals(itemCacheById.getType())) {
            Integer countByValidItemId = userBackpackDao.getCountByValidItemId(uid, itemId);
            if (countByValidItemId > 0) {
                return;
            }
        }
        // 没有才发
        UserBackpack build = UserBackpack.builder()
                .uid(uid)
                .itemId(itemId)
                .status(YesOrNoEnum.NO.getStatus())
                .idempotent(idempotentKey)
                .build();
        userBackpackDao.save(build);

    }

    private String getIdempotentKey(Long uid, IdempotentTypeEnum idempotentTypeEnum, String businessId) {
        return String.format("%d_%d_%s", uid, idempotentTypeEnum.getType(), businessId);
    }

}
